// 给你一个只包含 '(' 和 ')' 的字符串，找出最长有效（格式正确且连续）括号子串的长度。

//  

// 示例 1：

// 输入：s = "(()"
// 输出：2
// 解释：最长有效括号子串是 "()"

// 来源：力扣（LeetCode）
// 链接：https://leetcode-cn.com/problems/longest-valid-parentheses
// 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

#include<bits/stdc++.h>
#include<string>
#include<vector>
#include<unordered_set>
#include<unordered_map>
#include<set>
#include<queue>
#include<stack>
using namespace std;

// 看了题解，改进版本，增加start标志当前合法串的开始位置
// 执行用时：
// 4 ms
// , 在所有 C++ 提交中击败了
// 85.61%
// 的用户
// 内存消耗：
// 7.1 MB
// , 在所有 C++ 提交中击败了
// 61.26%
// 的用户


class Solution {
public:
    int longestValidParentheses(string s) {
        stack<int> sta1;
        int res = 0;
        int start =0;
        for(int i=0;i<s.size();i++){
            if(s[i]=='('){
                sta1.push(i);
            }
            else{
                // 无匹配(,重置start
                if(sta1.empty()){
                    start = i+1;
                }
                // 匹配成功
                else{
                    sta1.pop();
                    // 栈空，则为合法串右端点
                    if(sta1.empty()){
                        res = max(res,i-start+1);
                    }
                    // 栈非空，保存当前合法字段长度
                    else{
                        // 注意使用i-sta1.top()------"(()()"
                        res = max(res,i-sta1.top());
                    }
                }
            }
        }
        return res;

    }
};